namespace Digitalmes.Common.Utils;

/// <summary>
/// 数字处理帮助类。
/// </summary>
public static class NumberUtils
{
    /// <summary>
    /// 数据换算，并进行数据截取。
    /// </summary>
    /// <param name="value">要换算的值</param>
    /// <param name="conversion">换算因子，必须为 0.1、0.01、0.001、0.0001 或 10、100、1000、10000。</param>
    /// <param name="digits">保留小数，0 或 null 表示不截取小数。</param>
    /// <returns></returns>
    public static double? FactorConvertTo(double? value, string? conversion, int? digits)
    {
        if (value is not null && conversion is "0.1" or "0.01" or "0.001" or "0.0001" or "10" or "100" or "1000" or "10000")
        {
            return FactorConvertTo(value.Value, Convert.ToDouble(conversion), digits);
        }

        return MathRound(value, digits);
    }

    /// <summary>
    /// 数据换算。
    /// </summary>
    /// <param name="value">要换算的值</param>
    /// <param name="conversion">转换系数</param>
    /// <param name="digits">保留小数，0 或 null 表示不截取小数。</param>
    /// <returns></returns>
    public static double FactorConvertTo(double value, double conversion, int? digits)
    {
        var v = value * conversion;
        if (digits > 0)
        {
            return Math.Round(v, digits.Value);
        }
        return v;
    }

    /// <summary>
    /// 数据截取
    /// </summary>
    /// <param name="value">要截取的数据</param>
    /// <param name="digits">保留小数位，0 或 null 表示不截取小数</param>
    /// <returns></returns>
    public static double? MathRound(double? value, int? digits)
    {
        if (value.HasValue && digits > 0)
        {
            return Math.Round(value.Value, digits.Value);
        }

        return value;
    }
}
